<template>
  <div class="draft-notice-container">
    <!-- 操作按钮区域 -->
    <div class="search-form">
      <el-form :inline="true">
        <el-form-item>
          <el-button type="primary" @click="showAddForm = true; loadOptions()">添加部门</el-button>
          <el-button type="danger" @click="showDeleteForm = true; loadOptions()">删除部门</el-button>
        </el-form-item>
      </el-form>
    </div>

    <!-- 主要内容区域 - 使用 splitpanes 实现可拖拽调整宽度 -->
    <Splitpanes class="default-theme" @resize="handleResize">
      <Pane :size="leftPaneSize" :min-size="20">
        <!-- 左侧部门树 -->
        <div class="tree-container">
          <!-- <el-tree class="dept-tree" :data="data" :props="defaultProps" @node-click="handleNodeClick" default-expand-all /> -->
          <el-tree class="dept-tree" :data="data" :props="defaultProps" @node-click="handleNodeClick" default-expand-all
            :expand-on-click-node="false">
            <template #default="{ node, data }">
              <span class="custom-tree-node">
                <span class="tree-node-label" @click="handleLabelClick(node, data)">
                  {{ node.label }}
                </span>
              </span>
            </template>
          </el-tree>
        </div>
      </Pane>
      <Pane :size="100 - leftPaneSize" :min-size="30">
        <!-- 右侧员工表格 -->
        <div class="table-container">
          <div class="table-header">
            <h3>{{ currentDeptName || '部门' }}员工表</h3>
          </div>
          <el-table :data="sortedEmployees" border style="width: 100%" v-loading="loading">
            <el-table-column prop="empId" label="员工ID" width="120" align="center"></el-table-column>
            <el-table-column prop="name" label="姓名" width="150" align="center"></el-table-column>
            <el-table-column prop="deptName" label="部门" align="center"></el-table-column>
            <el-table-column prop="positionName" label="职位" align="center"></el-table-column>
            <el-table-column prop="age" label="年龄" width="80" align="center"></el-table-column>
            <el-table-column label="上下级关系" width="120" align="center">
              <template #default="scope">
                <el-tag :type="scope.row.isLeader === 1 ? 'success' : ''">
                  {{ scope.row.isLeader === 1 ? '领导' : '员工' }}
                </el-tag>
              </template>
            </el-table-column>
          </el-table>
        </div>
      </Pane>
    </Splitpanes>

    <!-- 添加部门对话框 -->
    <el-dialog v-model="showAddForm" title="添加部门" width="30%" align-center>
      <el-form :model="form" label-width="100px">
        <el-form-item label="部门名称">
          <el-input v-model="form.name" placeholder="请输入部门名称" />
        </el-form-item>
        <el-form-item label="上级部门">
          <el-select v-model="form.parentName" placeholder="请选择上级部门" style="width: 100%">
            <el-option v-for="option in parentOptions" :key="option.value" :label="option.label"
              :value="option.value" />
          </el-select>
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="showAddForm = false">取消</el-button>
        <el-button type="primary" @click="submitAddForm">确定</el-button>
      </template>
    </el-dialog>

    <!-- 删除部门对话框 -->
    <el-dialog v-model="showDeleteForm" title="删除部门" width="30%" align-center>
      <el-form :model="deleteForm" label-width="100px">
        <el-form-item label="选择部门">
          <el-select v-model="departmentName" placeholder="请选择部门" style="width: 100%">
            <el-option v-for="option in parentOptions" :key="option.value" :label="option.label"
              :value="option.value" />
          </el-select>
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="showDeleteForm = false">取消</el-button>
        <el-button type="danger" @click="confirmDelete">确认</el-button>
      </template>
    </el-dialog>

    <!-- 确认删除对话框 -->
    <el-dialog v-model="showConfirmDeleteDialog" title="确认删除" width="25%" align-center>
      <p>是否真的删除 <strong>{{ departmentName }}</strong> 及其所有子部门？</p>
      <template #footer>
        <el-button @click="showConfirmDeleteDialog = false">取消</el-button>
        <el-button type="danger" @click="submitDeleteForm">确定</el-button>
      </template>
    </el-dialog>
  </div>
</template>

<script>
import { Splitpanes, Pane } from 'splitpanes';
import "splitpanes/dist/splitpanes.css";
import {
  buildTree,
  getAllDepts,
  addDept,
  deleteDeptByName,
  getEmployeesUnderDept,
} from "../../api/dept";

export default {
  components: { Splitpanes, Pane },
  data() {
    return {
      data: [], // 树形结构数据
      employees: [], // 员工信息
      // 定义树形控件的属性映射
      defaultProps: {
        children: "children",
        label: "label",
      },
      showAddForm: false, // 添加部门表单显示与隐藏
      showDeleteForm: false, // 删除部门表单显示与隐藏
      showConfirmDeleteDialog: false, // 确认删除对话框显示与隐藏
      form: {
        name: "", // 部门名称
        parentName: "", // 上级部门名称
      },
      departmentName: "", // 要删除的部门名称
      addColumns: [], // 记录提交的表单内容
      parentOptions: [], // 动态生成的上级部门选项列表
      currentDeptName: "", // 当前部门名称
      leftPaneSize: 30, // 左侧面板初始宽度百分比
    };
  },
  computed: {
    sortedEmployees() {
      // 创建员工数组的副本以避免修改原始数据
      const employeesCopy = [...this.employees];
      // 对员工进行排序，使领导(isLeader === 1)排在前面
      return employeesCopy.sort((a, b) => {
        if (a.isLeader === 1 && b.isLeader !== 1) return -1;  // a是领导，b不是，a排在前面
        if (a.isLeader !== 1 && b.isLeader === 1) return 1;   // b是领导，a不是，b排在前面
        return 0;  // 两者都是领导或都不是，保持原顺序
      });
    }
  },
  methods: {
    handleResize(e) {
      if (e && e.length > 0 && e[0]) {
        this.leftPaneSize = e[0].size;
      }
    },

    // 点击树形节点标签时的处理函数
    handleLabelClick(node, data) {
      // 这里只处理标签点击事件，不处理展开/折叠
      this.currentDeptName = node.label;
      const params = { deptName: node.label };
      this.getEmployees(params);
    },

    // 加载上级部门选项
    loadOptions() {
      getAllDepts()
        .then((response) => {
          if (response.flag) {
            this.parentOptions = response.result.map((dept) => ({
              label: dept.name,
              value: dept.name,
            }));
          } else {
            console.error(response.reason);
            this.$message.error(response.reason);
          }
        })
        .catch((error) => {
          console.error("加载上级部门选项失败", error);
          this.$message.error("加载上级部门选项失败，请稍后再试");
        });
    },

    // 节点点击事件处理函数
    handleNodeClick(data) {
      console.log("点击的节点数据：", data);
      this.currentDeptName = data.label; // 更新当前选中的部门名称
      const params = { deptName: data.label };
      this.getEmployees(params); // 根据部门名称获取员工信息
    },

    // api-获取当前部门下的员工信息
    getEmployees(params) {
      getEmployeesUnderDept(params)
        .then((response) => {
          if (response.flag) {
            this.employees = response.result; // 将员工信息存储到 employees 中
          } else {
            console.error(response.reason);
            this.$message.error(response.reason);
          }
        })
        .catch((error) => {
          console.error("获取员工信息失败", error);
          this.$message.error("获取员工信息失败，请稍后再试");
        });
    },

    // api-处理添加部门表单提交逻辑
    submitAddForm() {
      // 封装参数对象
      const params = {
        name: this.form.name, // 新部门名称
        parentName: this.form.parentName, // 上级部门名称
      };
      console.log("提交的表单数据：", params);

      // 调用后端接口添加部门
      addDept(params)
        .then((response) => {
          if (response.flag) {
            console.log(response.reason); // 打印后端返回的成功信息
            this.$message.success(response.reason); // 弹出成功提示
            this.fetchData(); // 刷新树形结构数据
          } else {
            console.error(response.reason); // 打印后端返回的失败信息
            this.$message.error(response.reason); // 弹出失败提示
          }
        })
        .catch((error) => {
          console.error("添加部门失败", error); // 打印网络请求错误信息
          this.$message.error("添加部门失败，请稍后再试"); // 弹出失败提示
        });

      this.showAddForm = false; // 提交后关闭表单
      this.addColumns = []; // 清空提交的表单数据
      this.form.name = ""; // 清空表单数据
      this.form.parentName = ""; // 清空表单数据
    },

    // api-处理删除部门表单提交逻辑
    submitDeleteForm() {
      const params = {
        name: this.departmentName, // 要删除的部门名称
      };
      console.log("提交的删除数据：", params);
      const deleteDeptName = this.departmentName; // 存储要删除的部门名称
      // 调用后端接口删除部门
      deleteDeptByName(params)
        .then((response) => {
          if (response.flag) {
            console.log(response.reason); // 打印后端返回的成功信息
            this.$message.success(response.reason); // 弹出成功提示
            this.fetchData(); // 刷新树形结构数据

            // 检查当前选中的部门是否与要删除的部门相同
            if (this.currentDeptName === deleteDeptName) {
              // 如果相同，清空员工表内容并更新标题
              this.employees = []; // 清空员工表内容
              this.currentDeptName = ""; // 更新员工表标题为空
            }
          } else {
            console.error(response.reason); // 打印后端返回的失败信息
            this.$message.error(response.reason); // 弹出失败提示
          }
        })
        .catch((error) => {
          console.error("删除部门失败", error); // 打印网络请求错误信息
          this.$message.error("删除部门失败，请稍后再试"); // 弹出失败提示
        });

      this.showConfirmDeleteDialog = false;
      this.showDeleteForm = false; // 提交后关闭表单
      this.departmentName = ""; // 清空删除表单数据
    },

    // 点击确认删除按钮时弹出确认对话框
    confirmDelete() {
      this.showConfirmDeleteDialog = true;
    },

    // api-从后端获取树形结构数据
    async fetchData() {
      try {
        const response = await buildTree();
        if (response.flag) {
          this.data = this.transformData(response.result.children); // 转换数据格式
        } else {
          console.error(response.reason);
        }
      } catch (error) {
        console.error("获取部门树失败", error);
      }
    },

    // 转换后端返回的数据为 el-tree 所需的格式
    transformData(data) {
      return data.map((item) => {
        const node = {
          label: item.name,
          children: item.children ? this.transformData(item.children) : null,
        };
        return node;
      });
    },
  },
  mounted() {
    this.fetchData(); // 初始化树形结构数据
  },
};
</script>

<style scoped>
.draft-notice-container {
  padding: 20px;
  height: 95%;
  display: flex;
  flex-direction: column;
}

.search-form {
  background: #fff;
  padding: 20px;
  margin-bottom: 20px;
  border-radius: 4px;
}

/* 树形容器样式 */
.tree-container {
  height: 100%;
  padding: 10px;
  overflow: auto;
}

.dept-tree {
  font-size: 14px;
}

/* 表格容器样式 */
.table-container {
  height: 100%;
  display: flex;
  flex-direction: column;
  padding: 0 10px;
}

.table-header {
  margin: 15px 0;
  text-align: center;
  font-size: 16px;
  font-weight: 500;
  color: #303133;
}

/* splitpanes 样式调整 */
.splitpanes.default-theme .splitpanes__pane {
  background-color: #fff;
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}

.splitpanes.default-theme .splitpanes__splitter {
  background-color: #f5f7fa;
  border-left: 1px solid #ebeef5;
  border-right: 1px solid #ebeef5;
  width: 6px;
}

.splitpanes.default-theme .splitpanes__splitter:hover {
  background-color: #e4e7ed;
}

/* 表格响应式样式 */
.el-table {
  flex: 1;
  overflow: auto;
}

.el-table__body-wrapper {
  overflow-x: auto;
}

.custom-tree-node {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 14px;
  padding-right: 8px;
}

.tree-node-label {
  flex: 1;
  cursor: pointer;
}

/* 调整箭头样式 */
:deep(.el-tree-node__expand-icon) {
  cursor: pointer !important;
}
</style>